APRENDE 4 PROGRAMAR
ANIMACIÓN
Diseño: Cooper West
Edición: Nigel Cawthorne
Programas: Marcus Milton
David Rosam
Programas MSX Angel García García
Ilustraciones: Gerard Brown
Traducción: Angel García García
El traductor desea expresar su agradecimiento a
Gustavo Flores Maza por su colaboración en este libro
Queda prohibida la reproducción total o parcial de la presente obra bajo
cualquiera de sus formas, gráfica o audiovisual, sin la autorización previa y
escrita del editor, excepto citas en revistas, diarios o libros, siempre que se
mencione la procedencia de las mismas.
Título original: COMPUTER ANIMATION
O 1985, Aladdin Books Ltd.
O 1986, de la edición española, E. G. Anaya.
Villafranca, 22. 28028 Madrid.
I.S.B.N.: 84-7525-361-X.
Depósito legal: M. 20984-1986
Impreso por: Edime, S. A. Calle D, esquina a F.
Polígono Industrial Arroyomolinos. Móstoles (Madrid)
Impreso en España - Printed in Spain.
APRENDE A PROGRAMAR
ANIMACIÓN
Marcus Milton
ANAYA
AS
Introducción
Los gráficos por ordenador encierran muchas más sorpresas de
las que te puedes imaginar. En lugar de limitarte a Jugar o ilustrar
tus juegos puedes incluso escribir una historia, y construir tu
propio programa lleno de color y gráficos tanto estáticos como
animados. El programa se da para el sistema MSX y para el
Spectrum y cuenta la historia de la Casa Encantada.
El programa ha sido dividido en bloques lógicos, y un texto
paralelo explica cómo funciona cada sección. Escribir un
programa en bloques lógicos no sólo lo hace más sencillo de
entender tanto para ti como para otras personas; también reduce
las posibilidades de error del mismo. Al finalizar determinadas
secciones puedes probar lo que acabas de teclear; ten en cuenta
que incluso el error más pequeño puede hacer que el programa
no funcione. Si algo falla repasa los listados cuidadosamente.
Asegúrate de que tu programa coincide con el del libro. Los
siniestros acontecimientos que tienen lugar en la Casa Encantada
emplean técnicas muy útiles de programación de gráficos. Por
ejemplo, con un cuidadoso diseño de determinados caracteres
definidos por el usuario en el Spectrum es fácil conseguir,
mediante un programa en BASIC, un movimiento muy suave de
las figuras.
A
Contenido
Gráficos MSX
Gráficos Spectrum
El escenario
10
12
PROGRAMA DE CONTROL E INICIALIZACION 13
MSX 14
SPECTRUM , 16
DIA 19
MSX 20
SPECTRUM
En I=LEN
$ RETURN (R$)
HEN VB
y $=
?* GOSUB 1500. TS(R$, 3),
Gráficos MSX
EL BASIC del MSX permite animar figuras de una manera muy
simple mediante el uso de sprites. Estos son caracteres cuya
forma podemos definir y mover por la pantalla. Podemos definir
cuatro tipos de sprites: 8x8, 8x8 aumentado, 16x16 y 16x16
aumentado, según el número de pixels (puntos de la pantalla) y el
tamaño de éstos.
Veamos sobre un ejemplo cómo definir un sprite y cómo moverlo
por la pantalla.
SCREEN 2,2
FOR I=1 TO 32:READ N:A$=A9$+CHR$ (N) : NEXT
SPRITES (1)=4$
FOR J=240 TO 1 STEP -1:PUT SPRITE 1,(J,1):
FOR I=1 TO 50:NEXT: NEXT
GOTO 46
DATA 0,0,0,112,120,60,30,127,255,255,127,1,0,0,0,0,
0,9,9,4,14,30,62,254,255,255,254,254,240,120,60,28
O
06000
O
La línea 10 selecciona el modo de pantalla 2 —modo gráfico de
192x256 pixels— y los sprites de tipo 16x16. En las líneas 20 y 30
definimos el sprite leyendo los 32 datos necesarios (pues para el
sprite de 16x16 necesitamos 32 bytes) y asignando una cadena de
caracteres a la variable SPRITE $. El argumento de esta variable
(1 en este caso) selecciona el plano de definición de ese sprite.
Para entenderlo imaginemos la pantalla del monitor o televisor
compuesta por una serie de capas (PLANOS). Las imágenes en
los planos más cercanos al observador —planos inferiores—
parecen pasar por delante de las de los que se encuentran en
planos posteriores. La línea 40 se encarga de mover el sprite por
la pantalla; para ello indicaremos, en este orden, de qué sprite se
trata, sus coordenadas y el color en que queremos que se
imprima.
Después de los planos de sprites se encuentra el “plano
multicolor”. En él es donde aparecen las imágenes creadas por
manejo de textos y los comandos gráficos usuales PRINT,
DRAW, LINE... No obstante podemos modificar las imágenes
que aparecen en este plano para crear figuras más sofisticadas
como los árboles que veremos en la Casa Encantada.
Para ello hay que acceder directamente a la memoria de vídeo del
ordenador. El proceso es relativamente complejo y aquí sólo
pretendemos dar una idea general del mismo. Toda imagen en la
pantalla viene definida por las posiciones de memoria de la VRAM
(memoria de vídeo). En el modo 2 (gráfico) ésta se divide en cinco
bloques: tabla de patrones, que nos da la definición de cada
carácter en la pantalla de forma análoga a la de los sprites; tabla
de nombres, que nos indica para cada posición de pantalla dónde
se encuentra en la tabla de patrones la definición de dicha
posición; tabla de colores, que nos da el color de fondo y de
primer término de cada byte —8 pixels horizontales— de la tabla
de patrones; tabla de patrones de sprites, sobre la que
podemos actuar directamente para definir los sprites y, por fin, la
tabla de atributos de sprites, que nos da la posición, color y
número de patrón de cada sprite.
Veamos el proceso que hay que seguir para crear una imagen en
el plano de fondo. En primer lugar definiremos en la tabla de
patrones la figura que pretendemos obtener de una forma análoga
a la de definición de sprites. A continuación indicaremos en la
tabla de nombres para las posiciones de carácter que
pretendemos que tengan esa forma que el patrón se encuentra a
partir de un lugar determinado de la tabla de patrones. Por último,
si queremos, podemos modificar el color de cada carácter
actuando sobre la tabla de colores.
Aunque el proceso pueda parecer bastante complejo, si lo
manejamos con cuidado podemos llegar a obtener resultados
sorprendentes. No obstante conviene acudir a un libro
especializado para profundizar debidamente en el tema.
LA BASE DE LA DEFINICIÓN
DEL SPRITE DE 16x16
SON CUATRO CUADRADOS
DE 64 PIXELS
AA E OA
Gráficos Spectrum
La forma usual de animar un cáracter desde el BASIC en el
Spectrum es imprimir la figura, borrarla y volverla a imprimir en
una posición contigua. Generalmente el efecto de movimiento no
es muy bueno, pues la figura parece moverse a saltos. Y lo que es
peor, las figuras no pueden moverse uno o dos pixels cada vez
(deben localizarse en filas y columnas). No obstante, si
imprimimos tres o cuatro formas apropiadas en el espacio de dos
caracteres podemos crear la ilusión de que la figura se está
moviendo sólo unos pocos pixels cada vez. Podemos conseguir un
movimiento suave, libre de saltos, repitiendo este proceso sobre
posiciones sucesivas de la pantalla.
Prueba este programa.
FOR A=65348 TO 65439 ¿READ D: POKE A,D: NEXT A
20 DATA 24,12,134,255,255,134,12,24: REM (A)
30 DATA 0,0,09,240,240,0,0,0: REM (B)
40 DATA 6,3,33,63,63,33,3,6:2 REM (0)
50 DATA 0,0,128,252,252,128,0,0:REM (D)
50 DATA 1,0,8,15,15,8,0,1: REM (E)
70 DATA 128,192,96,255,255,96,192,128: REM (F)
86 DATA 0,0,2,3,3,2,0,0: REM (6)
90 DATA 95,48,24,255,255,24,48,96: REM (H)
100 DATA 0,6,0,192,192,0,0,0:REM (1)
$
O
66
O
10
FOR F=6 TO 28
FRINT AT 2,P3” AB": PAUSE 3
FRINT AT 2,5". CD" PAUSE =
FRINT AT 2,P5" EF": PAUSE 3
PRINT AT 2,P53" GHI": PAUSE 3
NEXT P
Las líneas 110 a 160 mueven el avión suavemente por la pantalla.
El secreto es que en realidad hay cuatro gráficos que parecen
iguales, excepto porque están situados en posiciones diferentes.
Cada gráfico se construye con dos o tres caracteres definidos por
el usuario (líneas 120 a 150). La figura que se imprime en la línea
130 está localizada dos pixels a la derecha de la figura impresa en
la línea 120; la figura de la línea 140 está situada dos pixels a la
derecha de la de la línea 130, y así sucesivamente. El lazo entre
las líneas 110 y 160 mueve el avión por la pantalla. El conjunto de
caracteres definidos por el usuario que se imprimen en las líneas
120 a 150 es como una minisecuencia animada (al imprimir
rápidamente la secuencia de gráficos de avión conseguiremos que
éste parezca moverse incluso dentro de un sólo carácter). El lazo
se limita a presentar en pantalla esta minisecuencia animada en
cada carácter de la línea. El carácter que imprimimos justo antes
de cada grupo de caracteres borra la última parte de la cola del
avión, que de no ser así quedaría atrás según se mueve éste por
la pantalla.
EL MOVIMIENTO DEL AVIÓN
SE CONSIGUE ¡MPRIMIENDO
LA SERIE DE GRÁFICOS DE LA
DERECHA. TODAS LAS FIGURAS
SON IGUALES PERO ;
COLOCADAS EN UNA POSICIÓN
DIFERENTE
el
El escenario
Antes de comenzar con el programa tenemos que elaborar el
argumento o guión de nuestra historia. El programa da vida a una
casa encantada y comienza por dibujar la imagen de una casa
antigua rodeada de un bosque fantasmagórico. Cae la noche... un
rayo atronador despierta a los murciélagos del campanario y una
vieja bruja sobrevuela la casa en su escoba. Mientras vuela en la
noche caen más rayos y relámpagos, que alcanzan la casa y
provocan el fuego en una de las torres. Las llamas se extienden y
la casa entera se derrumba. Como dramática conclusión de la
historia una tétrica calavera se alza sobre sus ruinas. La secuencia
dura unos minutos. Conviene dibujarse un guión como el de abajo
en un papel, de forma que puedas dividir el argumento en escenas
y sucesos separados.
CASA ENCANTADA
LA CASA SE DERRUMBA
LA CASA ARDIENDO
APARECE LA CALAVERA
EL PROGRAMA
DE CONTROL
Y LA INICIALIZACION
Una vez que hayas planeado la historia puedes escribir el programa
de control. Este te permite estructurar tu programa, dividiendo
cada sección en una serie de bloques más pequeños y manejables.
Esto lo conseguirás mediante el empleo de subrutinas. La primera
sección te muestra cómo escribir el programa de control y preparar
el ordenador para el comienzo de la animación.
rrroreno oe ts
CCT AAA AEREA GAIA,
ACA PAR recio,
OC er As RCA ras
La estructura del programa de control se ajusta al argumento. La
mayoría de las subrutinas se utilizan una sola vez, como las
empleadas para dibujar el castillo y los árboles. Las únicas
subrutinas que se repiten son las llamadas en las líneas 100 y 110.
Con ellas conseguimos mover el murciélago y la bruja por la
pantalla.
REM Casa Encantada
CLEAR 200, 61482!
SCREEN 2,2:COLOR 1,3,1:0L5
GOSUB £500:REM Inicializar
GOSUB 20668:REM Fondo
GOSUB 2500:REM Castillo
GOSUB 45006:REM Arboles
GOSUB 590%: REM Oscuridad
N=4:GOSUB 1500:REM Rayo
M=17300
FOR XB=9 TO 254 STEP 2
GOSUR 500:REM Murcielago
GOSUB 1000:REM Bruja
IF XB=254 THEN FUT SPRITE 2,(0,209)
NEXT XB
N=4:GOSUB 15060: REM Rayo
GOSUB 5500:REM Fuego
GOSUB £6006:REM Calavera
END
0000000
El programa de control se limita a llamar consecutivamente a una
serie de subrutinas para conseguir el dibujo en la pantalla. En la
línea 70, antes de llamar a la subrutina Rayo establecemos el
valor de N que será empleado por ésta para determinar el número
de relámpagos. Asimismo la línea 80 actúa sobre la variable M
necesaria en la subrutina Murciélago. Es conveniente trabajar de
esta forma con las subrutinas, pues así se hacen mucho más
flexibles.
REM Inicializar
FOR 1=61483' TO £1508!
READ N$:FOKE I,VAL("2£H"+N$) 2 NEXT
DEFUSR=61 4323!
FOR I=BASE(12) TO BASE(12)+15: READ
VFOKE (14+44096),N: NEXT
FOR I=BASE(12? TO BASE(12)+15:READ
O
VFOKE (14+4352),N: NEXT
FOR I=BASE(12) TO BASE(12)+15:READ
VPOKE (1+4409),N: NEXT
FOR I=BASE (14)+32 TO BASE (14)+191:READ N:
VPOKE I,N: NEXT
RETURN
00
6
Ni
N:
N:
60000
14
7600
7010
702
7030
7040
7050
70656
70670
7086
345000000000
La subrutina Inicializar comienza en la línea 6500. Las líneas 6510
y 6520 se encargan de leer los datos necesarios para configurar un
programa en código máquina que emplearemos para cambiar
instantáneamente los colores de la pantalla. La línea 6530 fija la
dirección a donde queremos llamar al comando USR. Las líneas
6540 a 6560 establecen la definición del árbol accediendo a la tabla
de patrones y actuando sobre la misma. La línea 6570 modifica las
posiciones correspondientes a la tabla de patrones de sprites
generando así los correspondientes al murciélago (dos), la bruja, la
luna y la llama.
Antes de continuar adelante graba el programa en cinta o disco,
ya que un error en esta etapa puede bloquear por completo el
ordenador.
e.
DATA DB,79,21,00,20,0E,99,ED,69,ED,61,21,00,00,7E,
14,D3,98,23,7C,FE, 18,C2,39,F0,C9:REM Cod. maquima
DATA 16,129,73,40,16,80,48,9,128,32,74,134,164,683,
204,30,5,:38,178,27,31,15,3,3,48,96,192,192,194,244
io z 128, 1d. 1133. 3 7 0d 315172. 172172) 1209120, 128
1,224,252: REM Arbol
DATA 0,0,0,16,56,125,235,63,15,3,2,0,0,0,0,0,0,0,0
,3,28,190,255,252,240,192,564,0,0,0,0,0: REM Murc. 1
DATA 0,0,0,0,0,13,31,673,63,67,26,24,8,0,0,0,0,0,0,
0,0, 1765,248,2532, 252, 252,88,24,16,0,0,0:REM Murc. 2
DATA 7+1,0,0,0,1,3,13979, 207,239 173,127) 1510,0,0, 12
,192,96,96,224,192,192,224,240,255, 192,128, 128,192
,9,0:REM Bruja
DATA 3,14,28,56, 122,120,254,255,2535,248,248,96,1092
135,31,3,0,0,0,0,128,0,0,128, 128,0,0,4,12,152,248,
240: REM Luna
DATA 0:32. 32+34, 30331) 31,127,123, 236,2281100,33, 3
371710,0,17,1/,49,115,227,167,167,191,186,164,200,
268,224,224: REM Llama
DATA 521,535,5460,547,550,562,565,570,580,592,600,
610,637,646,657,661,667,636,691,696,700:
REM Posicion arboles
DATA 177,48,169,64,1479,84,91,84,71,64,63,48:
REM Posicion llamas
Ed 5
LoS ARBOLES SE
ACCEDIENDO
15
060000000000
DIR
UJAN
DIRECTAMENTE
AM
La estructura del programa de control se ajusta al guión. La
mayoría de las subrutinas se emplean una sola vez, como la usada
para dibujar el castillo y los árboles. Las únicas subrutinas que se
repiten son llamadas en las líneas 100 y 110 dentro del bucle
FOR... NEXT constituido por las líneas 90 a 130. Estas
subrutinas mueven el murciélago y la bruja unos pocos pixels
cada vez que son ejecutadas.
REM e RR RA
REM casa encantada
REM 18 bytes de codigo mequima alma
linea 5
GO SUB 5500:
GO SUB 2006:
SO SUB 2500:
GO SUB 4500:
GO SUR 5006:
LET n=5: GO SUB 1500:
LET m=133%0
FOR b=6 TO 29
GO SUE 506: REM murcielago
GO SUB 10660: REM bruja
IF b=292 THEN FRINT AT 1,2903"
NEXT b
LET n=S: €O0 SUB 1506:
GO SUB 5506: REM fuego
GO SUB 4066: REM calavera
STOP
REM inicializar
REM fondo
REM castillo
REM arboles
REM oscuridad
REM rayo
REM rayo
600000060
Como puedes observar en la línea 70 establecemos el valor de la
variable n antes de entrar en la subrutina que dibuja el rayo. El
valor de n nos dará el número de rayos a dibujar en esa subrutina
(ver página 35). Es una buena técnica de programación escribir de
esta forma las subrutinas que vamos a emplear bastante en el
programa, ya que serán mucho más flexibles y versátiles. La línea
80 establece el valor de la variable m a su valor inicial antes de ser
empleada en el bucle que mueve el murciélago y la bruja. Se ha
preferido establecer su valor aquí en lugar de en la subrutina de
inicialización para distinguir a qué parte del programa pertenece.
La línea 120 se limita a imprimir tres espacios; éstos se emplean
para borrar la bruja cuando esta alcanza la última posición de su
trayectoria.
REM inicializar
FOR a=65368 TC £5527:
REM introducir codigo
REM de la linea 5
FOR i=23760 TO 223777:
RETURN
READ di POKE ad: NEXT a
maquina en la sentencia
READ d: NEXT i
POKE i,d:
16
700% DATA 16,129,77,40,16,80,48,9: REM arbol (A)
7010 DATA 128,32,74,134,164,68,204,306: REM arbol (B)
7020 DATA 5,38,178,27,31,15,3,3: REM arbol (0)
7030 DATA 48,96,192,192,192,244,152,128: REM arbol (D)
7040 DATA 1,1,1,3,3,7,31,51: REM arbol (E)
7056 DATA 192,192,192,128,128,128,224,252: REM arbol (F)
7060 DATA 8,16,48,32,96,96,233,224: REM luna (6)
7070 DATA 240,254,127,1173,48,54,31,6: REM luna (H)
00
35000
La línea 6500 es el comienzo de la subrutina de inicialización. La
línea 6510 lee los datos dados en las líneas 7000 a 7190 y los sitúa
en las direcciones especiales reservadas para caracteres definidos
por el usuario. Las letras entre paréntesis que hay detrás de cada
línea de datos te indican en qué letra en modo gráfico se ha
guardado cada carácter. La línea 6530 lee los datos de las líneas
7510 y 7520 y los emplea para crear una pequeña rutina en código
máquina. Este programa nos permite cambiar instantáneamente
determinados colores de la pantalla cuando se necesita cambiar la
escena de día a noche. Una vez que hayas tecleado hasta la línea
7540 comprueba con mucho cuidado lo que acabas de escribir, ya
que cualquier error en esta etapa puede bloquear el ordenador al
intentar rodar el programa. Lo único que puedes hacer si esto
ocurre es desconectarlo y comenzar de nuevo. De ahí que sea
conveniente guardar el programa en cinta al finalizar esta etapa, LOS ARBOLES SE DIBUJAN A BASE
de modo que simplemente debas cargarlo de nuevo en lugar de DE CARACTERES DEFINIDOS
volverlo a teclear si algo ha fallado. POR E USUAnIa
7030 DATA 1,2,6,230,19,255,17,226: REM bruja (1)
7090 DATA 0,6,0,128,240,128,0,06: REM bruja (J)
7106 DATA 9,0,1,57,4,31,4,56: REM bruja (K)
71106 DATA 64,129, 128,150,252,224,64,128: REM bruja (L)
7120 DATA 04,0,0,14,1,7,1,14: REM bruja (M)
7136 DATA 16,32,796,164,63,248,16,32: REM bruja (N)
7146 DATA 0,0,0,3,0,1,0,3: REM bruja (0)
7150 DATA 4,8,24,154,79,254,68,136: REM bruja (F)
7160 DATA 9,0,0,0,192,0,0,0: REM bruja (0)
7170 DATA 9,0,0,66,36,24,24,0: REM murcielago (R)
7186 DATA 0,0,0,0,0,235,24,6: REM murcielago (S)
7190 DATA 8,128,65,2,150,68,20,40: REM llamas (T)
7300 REM datos codigo maquina
7510 DATA 62,06,33,0,88,6,24,197,6,32
3209 DATA 119,35,16,252,193,16,245,201
7330 REM datos posicion ventanas
7340 DATA 10,22,8,23,14,19,14,127,10,79,8,8
Ó0O0000O
17
SD
O
>
Algunos de los caracteres del programa son creados empleando
varias figuras; así, los árboles están constituidos por seis
sentencias DATA que definen seis caracteres definidos por el
usuario, como se muestra en la página anterior. La bruja, sin
embargo, consta de nueve caracteres en total, ya que es animada
empleando la misma técnica que la del avión en la página 10.
Puedes animar la forma que quieras empleando un programa
similar y dibujando el gráfico en un diagrama como el que se
muestra a continuación, imprimiendo las figuras en diferentes
posiciones.
TT] LA BRUJA ES ANIMADA IMPRIMIENDO
FRTETTE MALE E LE
A eacramenre La misma PIsURa
MIT ITTTItI] EN cuaATRO POSICIONES
a aaa ela
LIGERAMENTE DIFERENTES,
EMPLEANDO MUEVE CARACTERES
DEFINIDOS POR EL USUARIO
Es
E
ba
bid
E
bd
E
Ll]
1
d
q
Ej | ||
Ed | |
A
+
OL
E
neo
q
[E
pl
pd
ES
pd
E]
$
a
E
En
E
A
Es
E:
ES
mM
|]
A
E
E]
Dn
4
+
Ñ
q
$
E
[E
PER
E
Ed
i
7]
E
E
E
E
o
a
|
E
Ll]
dl
E
HH
E
ES 111
7
ba
E
apra
¡
8
ES
$e
ES
3
7]
a
E
7]
5
SNA)
N rn A 7 | É
V-4E =3
%
———_—_—_—_—_——
o
DIA
Esta sección del programa establece el escenario de fondo de día, la
casa y el bosque fantasmagórico. También explica las subrutinas del
programa de control incluida la sección que dibuja los árboles.
19
función seno.
2060
20160
ZO25
2070
2040
2050
2060
26760
2080
2090
2100
2110
2120
Esta subrutina dibuja el cielo y el primer plano, así como el
camino que conduce a la puerta del castillo. La línea 10 del
programa principal había establecido el color de fondo a verde y
había borrado la pantalla. El bucle entre las líneas 2010 a 2030
dibuja 100 puntos negros situados en coordenadas aleatorias y
simulan las piedras sobre el suelo. El cielo lo dibujaremos a base
del carácter gráfico “MW” (no empleamos el comando PAINT pues
puede dar problemas al cambiar los colores con el programa en
código máquina). Es necesario emplear el comando OPEN
“GRP:” para imprimir dicho carácter, ya que estamos trabajando
en modo 2 —modo gráfico—. Las líneas 2050 a 2070 son dos
bucles anidados que se encargan de dibujar el cielo, comenzando
desde la esquina superior izquierda y terminando en el límite
impuesto a las piedras del suelo. Las líneas 2080 a 2110 dibujan el
camino. Este se consigue trazando una serie de líneas horizontales
cada vez más anchas que comienzan en puntos dados por una
REM Fondo
FOR R=1 TO 1896
X=INT (RND(13x*255): Y=130+INT (RND(1)x66)
FSE EX. Yi Ls MEJOT
OFEN "GRF:" AS $1: COLOR S
FOR Y=98 TO 120 STEF 8: FOR X=0 TO 248 STEF 8
FRESET (X,Y):FRINTH1,"N"
NEXT X:NEXT Y
I=15
FOR F=6%2 TO O STEF -2
XL IB ES IMEI) SO Z ESLINE (X.Y CAFE, YO 1
T=1+1.S: NEXT
RETURN
20
SES,
00
REM Castillo
Xx1=80:Y1=72: X2=158: Y2=120:LAD=
GOSUB REM Bloque frontal
x1=64:Y1=40: xX2=80: Y2=80:LAD=79:
GOSUE 3669: REM Torre izquierda
E
$
Xx1i=158:Y1=40:xX2=184: Y2=80:LAD=709:
GOSUB 3600:REM Torre derecha
xX3=75: YS=8:50S5UB 35300:REM Tejado izquierdo
Xx3=186: Y5=8: GOSUB 3500:REM Tejado derecho
FOR Y=6£08 TO 72
ILENE 189, Y =CL6Z SY) 006
NEXT
008
00
$
6
El castillo lo dibujamos mediante la subrutina que comienza en la
línea 2500. Consta de tres volúmenes principales que se consiguen
mediante la subrutina Bloque que explicaremos posteriormente.
Antes de entrar en la misma es necesario establecer los
parámetros que le servirán para determinar los límites de cada
bloque. Las líneas 2510 a 2530 definen la posición de cada UTINA Edd
, a LA SUBRUT!
volumen así como el valor de la variable LAD (que emplearemos OQUE NECESITA |
para simular el enladrillado) y llaman a dicha subrutina. A BL E PARÁMETROS
continuación las líneas 2540'y 2550 actúan de forma parecida C/ERT DIBUJAR CADA
sobre la subrutina Segmento encargada de dibujar los tejados de PA ÚGULO
las dos torres laterales; establecen el valor del vértice de cada una REC
y llaman a la subrutina.
El bucle FOR... NEST entre las líneas 2560 y 2580 dibuja el
tejado principal mediante unas líneas horizontales entre las dos
torres. Para dibujar las seis ventanas emplearemos también otra
subrutina —que comienza en la línea 4000— y que, como las
anteriores, necesita de dos parámetros que indiquen la posición
de cada ventana. Por fin la línea 2660 dibuja la puerta a base de
líneas negras de anchura creciente hasta que alcanzan un máximo
y lo mantienen.
2600 X=68: Y=47: GOSUB 40009
2610 X=76:Y=67:GOSUB 4006
26206 X=182: Y=47:GOSUB 4000
2630 X=174: Y=67:GOSUE 4000
2640 X=96: Y=83:G0SUB 4000
2650 X=154: Y=83: GOSUB 4090
2660 FOR Y=104 TO 127: 1F Y:2112 THEN
LINE (232-Y,Y)-(24+Y,Y),1: NEXT
ELSE LINE (120,Y)-(136,Y), 1: NEXT
RETURN
S
O
O
¡$
S
S
O
21
6 REM Bloque
6 FOR Y=Y1 TOD Y2 STEF 8:FOR X=X1 TO X2 STEP 3
6 COLOR 79:PRESET (X,Y):FRINT $1,"B"
036 NEXT X:NEXT Y
3046 FOR Y=Y1 TO Y2+7 STEF 2
LINE (X1,Y)-(X2+7,Y>,1
NEXT Y
2076 COLOR 1:FOR M=1 TO LAD
A=INT (RND(1)x (X2-X1+7)+X1)2
B=INT (RND(1)*(Y2-Y1+7)+Y1):FSET (A,B),1
3090 NEXT M E
RETURN
SS
6060
e
lod
NS]
¿3
6
Le
y
O
NS
4
e
>
O
La subrutina Bloque es la encargada de dibujar el frente del
castillo y las dos torres. El efecto de enladrillado se consigue en
tres etapas. En primer lugar se dibuja un fondo rojo. Para ello es
necesario conocer los límites del rectángulo a dibujar; éstos vienen
dados por X1, X2, Y1 e Y2 y son actualizados antes de entrar en
la subrutina. Los bucles anidados entre las líneas 3010 y 3030 se
encargan de dibujar el rectángulo base. La segunda etapa consiste
en dibujar una serie de líneas negras horizontales sobre el
rectángulo —líneas 3040 a 3060—; hasta ahora lo que tenemos es
un rectángulo rayado en rojo y negro. Para terminar el efecto de AL ¡MPRIMIR PUNTOS
enladrillado dibujaremos una serie de puntos negros sobre el NEGROS ALEATORIOS
bloque —líneas 3070 a 3090—. Las coordenadas de estos puntos soBRE El PO
no deben rebasar los límites del muro. Los puntos negros sólo se RAYAS coNsES
: A : FECTO
verán cuando estén sobre rayas rojas. es ENLADRILLADO
La subrutina Segmento —línea 3500— dibuja una serie de radios
de circunferencia de centro XS, YS —parámetros asignados
antes de entrar en la subrutina— y simula el tejado de las torres
laterales. Por fin las ventanas son dibujadas mediante la subrutina
que comienza en la línea 4000 por un procedimiento análogo al de
la puerta.
3500 REM Segmento
39106 R=38
3520 FOR T=1698 TO 200 STEP 2
35306 A=Tx3.14/180: X==RXASIN(A) : Y=RAxCOS(A)
Za ILTNE (XS. 1SI= ASF As VO= Ye 6
2550 NEXT
25056 RETURN
SS
O
S
4000 REM Ventana
4610 I=5
40620 FOR J=Y TO Y+17:1F J<Y+S THEN
LTNE (X4L/Z,. dd) CX6=1/2.0)0 13 11-12 NEXT
EESE LINE (Xd) Ext: ds LONEXT
RETURN
2
43506 REM Arboles
4510 DIM A(Z21)
4520 FOR J=1 TO 21: READ N:A(J)=N:2NEXT
4536 FOR J=i TO 21
4540 I=BASE(10)4+A1J>
230 VRFOKE (1)¿09VEOKE (I+1), 1SVPOKE (I+327.4325
VFOKE (1423) ,33:VPOKE (1+64),64: VPOKE (1+65),65
4566 NEXT J
457% R=153066: GOSUB 300
526 RETURN
6080808
00060
O
S
Sólo queda añadir los árboles para completar la escena. Esto lo
lleva a cabo la subrutina que comienza en la línea 4500. El
proceso ya se ha indicado en la introducción. En primer lugar hay
que definir la forma de los árboles accediendo a la tabla de
patrones (ésto ya lo hicimos en la subrutina de inicialización,
líneas 6540 a 6560). A continuación hay que indicar en la tabla de
nombres, en cada posición de pantalla que queremos que
contenga parte del árbol, dónde se encuentra la información que
define dicha porción. Una vez hecho esto aparecerá el árbol en
pantalla.
En primer lugar la línea 4510 DIMensiona la matriz que va a
contener las posiciones de pantalla correspondientes a la esquina
superior izquierda de cada árbol. El bucle 4520 asigna a esta
matriz los valores correspondientes. A continuación el lazo
constituido por las líneas 4530 a 4560 se encarga de alterar las
posiciones oportunas de la tabla de nombres para indicar dónde
se encuentra la definición de cada porción de árbol. La línea 4570
introduce un retardo que lleva a cabo la subrutina que comienza
en la línea 300 —un simple bucle FOR... NEXT que cuenta de
laR.
Con esta subrutina has completado la parte del programa
encargada de dibujar el escenario de la acción.
23
Debes tener mucho cuidado al proyectar cualquier clase de
gráficos en el Spectrum, ya que éste no te permite usar mas que
un color para el fondo y otro para la tinta en cada carácter. La
subrutina Fondo, que comienza en la línea 2000 borra la pantalla
y la pasa a color verde (PAPER 4). Un bucle FOR...NEXT elige
100 coordenadas aleatorias en la mitad inferior de la pantalla y
dibuja un punto negro en cada una. Estos puntos simulan rocas, y
ayudan a romper la monotonía del suelo. El cielo se dibuja
cambiando el color a cyan (PAPER 5) y usando dos bucles
FOR... NEXT anidados para imprimir una serie de espacios
coloreados en la mitad superior de la pantalla. La línea 2080 pasa
la tinta a color negro para dibujar la línea del horizonte que
separará tierra y cielo. A continuación se fija el valor de la variable
i a cuatro antes de entrar en otro bucle que se encarga de dibujar
el camino. Este lo conseguiremos trazando una serie de líneas
horizontales cada vez más anchas que comienzan en puntos
dados por una función seno. La anchura creciente se consigue
incrementando el valor de la variable i que nos da el número de
pixels que debe contener cada línea horizontal. La subrutina
finaliza en la línea 2130.
20608 REM fondo
PAPER 4: INK 62 TLS
FOR r=i TO 160
LET x=INT (RND*255):
NEXT ri: FPAFER S
FOR y=98 TO 12: FOR
PRINT IAT Y." U:
NEXT x: NEXT y
INE O
ELOT 6,72: DRAW 255,6:
FOR p=39 TO 6 STEF -2
PLOT 130*SIN (p/30),p:
NEXT p
RETURN
LET y=INT
x=6 TO
REM espacio
(RNDx80): FLOT x,y
SL
LET 1=4
DROW 1,0: LET i=i+2
24
25006 REM castillo
2510 LET x1i=102: LET x2=21:2 LET yi=16: LET y2=16:
LET lad=4006: GO SUB 3600: FEM bloque frontal
2320 LET x1=8: LET x2=162 LET yi=6: LET y2=11:
S
O
O LET lad=106: GO SUB 3606: REM bloque torre izda.
2330 LET.x1=21: LET.x2=231 LEFT yi=6: LET y2=11:
LET lad=100: GO SUB 20602 REM bloque torr= dcha.
Ss
E
G
LET ys=159:
R
E
R
2340 LET xs=75:1
90: REM segmento tejado torre izda.
25590 LET xs=179: LET ys=159:
GO SUB 35006: REM segmento tejado torre dcha.
FOR r=88 TO 163
2570 PLOT 88,r: DRAW 79,0
2580 NEXT r
SIMS
O
La subrutina castillo, que comienza en la línea 2500, se encarga
de dibujar el edificio. No obstante es la subrutina bloque —línea
3000— la que consigue dibujar el enladrillado del frente y las dos
torres laterales. Las variables x1, x2, yl, e y2 establecen la
posición del bloque que debe ser rellenado de ladrillos, y se
estudiarán con detalle en la página siguiente al describir la
subrutina bloque. Las líneas 2540 y 2550 establecen los vértices
de los tejados de las torres antes de llamar a la subrutina 3500
que se encarga de dibujarlos. Un bucle FOR.... NEXT entre las
líneas 2560 y 2580 dibuja el tejado principal mediante una serie de
líneas horizontales entre las dos torres. La línea 2590 imprime una
serie de cuadrados para representar las almenas de la parte
frontal. El símbolo 8 entre las comillas indica que debes poner el
ordenador en MODO GRAFICO (pulsa CAPS SHIFT y 9) y
pulsar la tecla 8. A continuación se dibujan seis ventanas mediante
la subrutina 4000. Como antes las líneas 2600 a 2650 definen la
posición de cada ventana antes de entrar en la subrutina que se
encarga de dibujarlas. Por último la línea 2660 emplea el carácter
gráfico 8 para imprimir una puerta. Esta consta de cuatro
caracteres de este tipo.
23570 FOR b=12 TO 206 STEP 2:
FRINT AT 14,.b3"8”"s NEXT 63 SEM (€)
LET x=68: LET y=162: GO SUE 4066
¿2616 LET x=76: LET y=88: GO SUB 46060
2620 LET x=182: LET y=102: GO SUB 4000
LET x=174:2: LET y=88: GO SUB 4600
2640 LET x=96: LET y=56: 60 SUB 46900
LET x=157: LET y=56: €O0 SUB 4006
FRINT AT 15,153"38"34T 15,15;”88":
REM 18), 1875 68), (8)
RETURN
oo
060808
6
bh
o
dl
>
O
NA
So
58
O
e
t)
o
3
S
25
3000 REM bloque
¿30109 FOR y=y2 TO y1 STEP -—1: FOR x=x1 TO
3030 NEXT x: NEXT y
3059 FOR y=y2 TO y1 STEP -2
306
7076 NEXT y
2080 FOR m=1 TO lad
3096 LET a=INT (RND*(x2=x1+7)+x 1):
SS
LA
o
NEXT m
RETUEN
Ss
La subrutina bloque se emplea para dibujar el frente de la casa y
las dos torres laterales. Veamos cómo conseguir el efecto de un
muro de ladrillos. En primer lugar se dibuja una serie de espacios
en rojo (PAPER 2) entre los límites dados por las coordenadas
mediante los bucles FOR... NEXT en las líneas 3010 a 3030. De
esta forma conseguimos la base del muro. Sobre ésta se dibuja
una serie de líneas negras horizontales comenzando en pixels
alternados a lo largo del eje y mediante el bucle entre las líneas
3050 y 3070. Hasta ahora lo que tenemos es un rectángulo rayado
en rojo y negro. Para transformarlo en un muro enladrillado
dibujaremos una serie de puntos negros situados al azar en dicho
rectángulo. La variable lad contiene el número de puntos a
distribuir. PLOT a,b, se encarga de dibujar dichos puntos en la
posición x,y. Estas coordenadas se calculan de modo que se
encuentren siempre dentro de los límites del muro. Los puntos
negros sólo se verán cuando se dibujen sobre líneas rojas. De esta
forma se completa el efecto de enladrillado. La subrutina
segmento —-que comienza en la línea 3500— se limita a dibujar
un sector de círculo de radio 39 pixels y de centro las
coordenadas xs, ys para conseguir los tejados de las dos torres
laterales. Las ventanas se dibujan en la subrutina que comienza en
la línea 4000 mediante un lazo que traza una serie de pequeñas
líneas negras horizontales.
A————_—_—_—_9==============_——_——
33900 REM segmento
3310 LET r=2309:2: INE 3
55206 FOR t=156 TO 200
3946 FLOT xs,ys: DRAW x,y
23350 NEXT +t
35966 RETURN
409 REM ventana
5011 NEXT w
4020 RETURN
060000
He
3020 FAPER 2: FRINT AT y,x3" "2: REM espacio
3040 LET x1=x1%8: LET x2=x2*8: LET yi=y1*8: LET y2=y2x*8
3050 INK 0: PLOT x1,168-y: DRAW (x2-x1)+7,0
LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b
2036 LET a=txP1/186: LET x=rx*SIN (a): LET Y=r*COS (a)
4018 INE 0: FOR w=y TO y+10: FLOT x,w: DRAw E,
O
”
SS
SE)
MURO
A NCADRILLADO sE ]
cowvsIGUE DISTRIBUYEND
PUNTOS NEGROS ALEATORIOS
SOBRE LOS TRES
RECTÁNGULOS EN ROJO
LY NEGRO QUE CONSTITUYEN
LA CASA
30000
26
4360 REM arboles
4519 FAFER 4: INK 0: OVER 1
4520 FOR t=1 TO 30
4530 LET x=INT (RND*293: LET y=13+INT (RND*7>
1540 1F (x>8 AND x<22 AND yx17) THEN GO TO 4536
4556 FRINT AT y,x3"AB"3AT y+1,x3"CD"30T y+2,x3 "EF":
REM (8), 1B)3 0). (D)3 tE), (F)
4566 NEXT t
4576 OVER 0: FAUSE 200
245806 RETURN
O
O
SO
SS
O
O
Sólo queda añadir el bosque siniestro para completar la escena de
día. La subrutina de la línea 4500 dibuja 30 árboles en posiciones
aleatorias sobre la hierba. Cada árbol tiene un color verde de
fondo (PAPER 4); de ahí que sea necesario asegurarse de que no
se va a imprimir en el cielo —línea 4530— ni sobre la casa
—línea 4540.
Cada árbol se compone de seis caracteres, agrupados de dos en
dos, en tres bloques (línea 4550). La instrucción OVER 1 en la
línea 4510 tiene el efecto de hacer un carácter transparente, de
modo que al imprimirlo sobre otro se vean ambos. Cuando parte
de un árbol se imprime sobre otro es posible ver a través del que
está en primer plano. Una vez que se han dibujado todos los
árboles, la instrucción OVER 0 en la línea 4570 recobra la
impresión normal.
Tras una pequeña pausa la subrutina finaliza con una instrucción
RETURN y se devuelve el control al programa principal. Una vez
que hayas añadido esta subrutina al programa habrás completado
todas las rutinas que dibujan la escena.
27
Prueba tu programa
Antes de continuar introduciendo la siguiente parte del programa
conviene guardarlo en cinta (“salvarlo”). Encontrarás las
instrucciones oportunas en el manual del usuario. Puedes, no
obstante, probar lo que llevas hecho hasta ahora siguiendo las
instrucciones de abajo. Si no has cometido ningún fallo al
introducir el programa verás aparecer el fondo, el castillo y los
árboles. Si hay algún error repasa tus listados y compáralos con
los del libro.
MSX : TECLEA 55
GOTO 55 Y PRUEBA EL
PROGRAMA.
PULSA CTRL-STOP UNA
VEZ HAYAS COMPROBADO
QUE EL PROGRAMA
FUNCIONA CORRECTAMENTE.
BORRA LA LINEA 55 ANTES
DE CONTINUAR CON LA
SIGUIENTE SECCION
SPECTRUM: TECLEA 55
GOTO 55, Y PRUEBA EL
PROGRAMA. PULSA LAS
TECLAS CAPS SHIET Y
BREAK UNA VEZ HAYAS
COMPROBADO QUE EL
PROGRAMA FUNCIONA
CORRECTAMENTE.
-| BORRA LA LÍNEA 55 ANTES
DE CONTINUAR CON LA
SIGUIENTE SECCION
28
A estas alturas conviene dibujar sobre el papel todos los efectos
que vayas a introducir. Conoces las dimensiones de la casa, de
forma que puedes distribuir todas las secuencias animadas a su
alrededor. Plantéalo todo sobre el papel,.así podrás estudiar si
alguno de los caracteres colisiona con otro, o si se desplaza a
algún lugar que no deba. Ten cuidado de no borrar los gráficos
que ya has dibujado imprimiendo encima de ellos.
5050 REM Gscuridad
5610 FRINT USR(G)
Soz20 FUT SFRITE 4, (15,8,160
5907306 R=1606: GOSUB 2300
5046 RETURN
Para pasar de día a noche debes cambiar alguno de los colores de
la pantalla. El BASIC del MSX no lo permite con un comando
directo, de ahí que haya sido necesario introducir un programa en
código máquina —mucho más rápido— que lo realice. El
funcionamiento de este programa es muy simple; se limita a
cambiar todas las posiciones de memoria de la VRAM
500 REM Rayo
1510 FOR I=1 TO N
1520 FSET (240,0):DRAW "C1163ZR16631"”
1530 POKE 61498!',2H1F:PRINT USRCO)
1540 R=200:GOSUB 200
1550 POKE 61498!,2£H14:PRINT USR(09)
15606 PSET (240,0):DRAW "C1632R16631"
1570 R=400:GOSUB 2090
1580 NEXT 1
15909 RETURN
306aSs
300
O
sr
correspondientes a la tabla de colores e introducir en ellas el
mismo valor, de forma que casi instantáneamente la rutina
consigue que todos los colores de fondo pasen a azul oscuro y los
correspondientes a primer término pasen a negro. No obstante
puedes cambiar estos colores alterando la posición de memoria
61498 que contiene el valor a introducir en las posiciones de
memoria anteriores, como luego veremos.
La línea 5010 pasa el control a esta rutina en código máquina, a
continuación se imprime la luna en color amarillo colocando el
sprite 4 en la posición oportuna. Por fin la línea 5030 introduce
un nuevo retardo basado como antes en la subrutina 300.
La subrutina Rayo produce un relámpago y dibuja un rayo cuatro
veces seguidas —tantas como indique el parámetro N—. El rayo
se consigue mediante la línea 1520, que dibuja una línea quebrada
amarilla. A continuación la línea 1530 altera la posición de
memoria que contiene los códigos de colores para la rutina en
código máquina haciendo que el fondo pase a ser blanco —de
código de color F— (15 en hexadecimal)— y el primer término
negro —de código de color 1—; tras ésto se llama a la rutina en
máquina. Después de un pequeño retardo la línea 1550 restablece
los colores iniciales y la 1560 borra el rayo dibujándolo de nuevo
en negro.
FONDO AZUL OSCURO
|
'
'
|
|
ESOO
PRIMER |
TERMINO |
NEGRO
AS
FONDO BLANCO
LA SUBRUTINA EN CODIGO
MÁQUINA SE ENCARGA
DE CAMBIAR
INSTANTÁNEAMENTE
LOS COLORES DE
LA PANTALLA
PRIMER
TERMINO
NEGRO
3l
REM Murcielago
IF Mí50 THEN XM=XM+2:G0TO 5730
M=M-15: A=M43. 14/1859: XM=120+ INT (40x*SIN(A)):
Yi=30+ INT” (23x*CD05S(00))
PUT SFRITE 1, (XM,YM, 13
R=96:GOSUB 300:FUT SPRITE 1, (6,209)
RUT SERTTE 2, (XM, YM), 13
R=20:GOSUB 3002: PUT SPRITE 2,(0,209)
RETURN
0000
El movimiento de la bruja y el murciélago lo controlan las líneas 80
a 130 del programa principal. La subrutina Murciélago —línea
500— emplea la variable M para calcular la trayectoria entre las
dos torres. Inicialmente vale 1300 —línea 80— y cada vez que se
ejecuta esta subrutina se decrementa 15.unidades. Cuando M
supera cierto valor la línea 520 calcula sus coordenadas, que
corresponden a las de una elipse, y actualiza el valor de M. Si no
lo supera, la línea 510 habrá modificado XM para que el
murciélago siga a la bruja. La línea 530 coloca el sprite 1
—murciélago con las alas abiertas— en dicha posición y tras un
retardo la línea 540 lo borra de la pantalla haciendo que su
posición vertical valga 209. A continuación se repite el mismo
proceso con el murciélago con las alas cerradas —líneas
550 y 560.
1000 REM Bruja
1010 YB=32+24x*SIN(XB*2x3. 14/2549)
1020 PUT SPRITE 3,(XB,YB),3
1030 RETURN
El movimiento de la bruja es más simple pues su coordenada
horizontal es incrementada de dos en dos en la línea 90 y su
coordenada vertical se calcula en la línea 1010 de forma que trace
una sinusoide en la pantalla. La línea 1020 coloca el sprite
correspondiente en su posición. Cuando la bruja llega al final de la
pantalla, la línea 120 del programa principal lo detecta y la hace
desaparecer.
Para dibujar el fuego en la casa podríamos haber optado por
definir el mismo sprite (llama) en diferentes planos y haber
colocado estos sprites por toda la casa, teniendo en cuenta que
no puede haber más de cuatro en la misma línea. No obstante se
ha elegido un procedimiento más ingenioso, ya que con un sólo
sprite podemos dar la sensación de que el fuego se extiende y la
casa entera arde.
En primer lugar la línea 5510 DIMensiona la matriz que va a
contener las coordenadas x e y de cada llama (estas son tales que
5506 REM Fuego
3310 DIM FC(2,6)
55920 FOR G=1i TC 4
55306 READ X,Y:F(1,6)=X:F (2,6)=Y
5540 NEXT G
5550 N=0
95664 FOR T=1 TC 4
5570 N=N+1
5380 FOR D=1 TO 3
35539% FOR J=1 TON
SEDO FUT SPRITE a (FU. EZ ds dl
5610 FUT SPRITE 5, (0,209)
620 NEXT J:NEXT DINEXT T
5630 FOR Y= 8 TO 96 STEF 8:FOR X=56 TO 200 STEF 8
5640 COLOR 1:FRESET (X,Y):PRINT*1,"LC"
5650 NEXT X:NEXT Y
o
06000000
el fuego parece salir de las ventanas). Las líneas 5520 a 5540
rellenan dicha matriz con los datos de la línea 7080. A
continuación, tres bucles anidados se encargan de animar la
escena. El fuego se imprime en amarillo en las posiciones dadas
por F(1,j) y F(2,j) en la línea 5600, y la línea 5610 lo borra; ésto se
repite 30 veces, de forma que las llamas titilan. Según aumenta N,
J va tomando distintos valores, lo que hace aparecer una nueva
llama en otra ventana, hasta que el fuego alcanza la última.
La casa se derrumba mediante el bucle 5630 a 5650, que imprime
un rectángulo negro sobre la misma.
O
6645 REM Calavera
é6615 COLOR 15
60206 CIRCLE (123,40),36,15,0,3.1457:FSET (92,738):
DRAW"M+20, 56R32M+20,-36"”
60636 CIRCLE (112,40) ,8: CIRCLE (144,460),8
606340 PSET(116,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U
8R4D1264L 4U41L.4D4L 41/41 4D4L 4U41 4D41L 4H4U 12"
6056 FSET (126,944): DRAW "Di6H9M+4,-12"
6660 FSET (12306,44):DRAW "Di£6 ESM-4,-12"
5070 PAINT (128,5),15,15
6680 R=3000: GOSUB 2300
6676 CLOSE +1
£1006 RETURN
SO
08
La fantasmagórica calavera que se cierne sobre las ruinas de la
casa se consigue mediante la subrutina Calavera. Gracias al
macrolenguaje gráfico que posee el sistema MSX podemos crear
cualquier figura con facilidad. Así, la línea 6020 dibuja el contorno.
Este se compone de un semicírculo y tres líneas rectas que unen
sus extremos; todo se dibuja en color blanco (15). La línea 6030
dibuja los dos ojos y la 6040 la boca a base de una poligonal
cerrada. Por último, las líneas 6050 y 6060 se encargan de trazar
dos triángulos que simulan la nariz La sentencia PAINT (línea
6070) elige un punto interior a la figura y pinta el interior de la
misma de blanco. Tras un retardo, la línea 6090 cierra el fichero
que abrimos al principio del programa, mediante una sentencia
CLOSE.
300 REM Retardo
310 FOR K=1 TO R2NEXT
3206 ¿RETURN
Unicamente queda analizar la subrutina Retardo que, como
habíamos apuntado, se limita a contar de 1 a R, con lo que el
tiempo que tardará en ejecutarse será proporcional al valor de
esta variable.
e AI
E 7
S
TURN
REM oscuridad
POKE 23761,1: RANDOMIZE USR 2376%
PAFER 602 INK 6: PRINT AT 3,33"G":308T 4,353"H":
REM (6): (1H)
PAUSE 1060
RETURN
(A A]
in 2
Para pasar de día a noche hay que cambiar algunos colores de la
pantalla. El BASIC del Spectrum no lo permite, de ahí que haya
que emplear el código máquina que habíamos introducido. El
programa en código máquina se activa en la línea 5010; todos los
pixels correspondientes a tinta se cambian a azul oscuro, y los
correspondientes a papel a negro. RANDOMIZE USR significa
“ejecuta el programa en código máquina” que comienza en la
dirección de memoria indicada. La línea 5020 imprime la luna en
color amarillo y, tras una pequeña pausa, la subrutina finaliza.
El programa de control llama ahora a la subrutina rayo que
comienza en la línea 1500. Una serie de instrucciones PLOT y
DRAW dibujan una línea negra quebrada desde la esquina
superior derecha de la pantalla. El rayo no se ve hasta que la línea
1530 llama al programa en código máquina, que cambia los pixels
del rayo a blanco (POKE 23761,7). El código máquina cambia el
color de la luna, de ahí que la línea 1540 la imprima de nuevo en
amarillo. Esto ocurre tan rápidamente que la luna parece no
cambiar de color. Después de una pequeña pausa en la línea 1545
la rutina en máquina vuelve a cambiar el color de la tinta a azul.
La línea 1560 restablece la luna en amarillo y el rayo se borra
imprimiéndolo de nuevo en negro. Tras una pequeña pausa se
repite el bucle otras cuatro veces, ya que habíamos fijado la
variable n a cinco.
REM rayo
FOR 1=1 TO nm
INK 6: FLOT 255,176: DRAW -27,-4%€: DRAN 10,0:
DRAW -29,-40
POKE 23761,7: RANDOMIZE USR 23/69
INK 6: FRINT AT 3,35"6"30T 4,3 5H": REM (635 (H)
FAUSE $
6 POKE 23761,1: RANDOMIZE USR 23/66
INK 6: PRINT AT 3,35"G"30T 4,33"8H": REM
INK 62: FLOT 255,176: DRANWN -39,-40: DRÁN
DRÁAW -29,-406
FAUSE 1
NEXT 1
RETURN
$)
pe pa pos
sm
Y
Cn cn CA
ji 5
S
Oo
60868
900
006
Oo
REM murcielago
IF m<150 THEN LET xm=xm+1: 60 TO 5230
LET m=m-8: LET a=m*P1/180:
LET xm=16+I1NT (4.5*SIN (a))
LET ym=4+INT (3.5*C0S la))
FAFER 0: INK 7: FRINT AT ym,xm3"R":* REM (R)
PAJSE 3 .
FRINT AT ym,xmi3"S"2 REM (5)
PAUSE
FRINT AT ym,xmi3" "2: REM esp
RETURN
Si analizas las líneas 90 a 130 del programa de control (que
corresponden a un bucle FOR... NEXT), verás que el murciélago
y la bruja son animados simultáneamente. La subrutina
murciélago, que comienza en la línea 500, emplea la variable m
para calcular las coordenadas de la trayectoria elíptica que sigue
el murciélago entre las dos torres.
Sin embargo, antes de realizar ningún cálculo, la línea 510 estudia
el valor de m. Si éste es menor que 150 el murciélago deja de dar
vueltas y parece intentar cazar a la bruja. Si m no es menor que
150, la subrutina salta a la línea 520, donde se emplean las
funciones SENO y COSENO para dibujar el camino espiral. A
continuación se imprime el murciélago batiendo sus alas
alternando los caracteres R y S.
La bruja se anima de distinta forma al murciélago mediante la
subrutina que comienza en la línea 1000. Esta subrutina opera de
la misma forma que la rutina que animaba el avión al comienzo
del libro, mediante diferentes caracteres definidos por el usuario
impresos consecutivamente en cada posición de carácter a través
de la pantalla.
Antes de imprimir cada grupo de caracteres correspondientes a la
bruja se llama a la subrutina murciélago. De esta forma
conseguimos que el movimiento de aquella sea mucho más suave,
ya que mientras el murciélago se mueve un carácter la bruja sólo
lo hace dos pixels. De no ser así el movimiento de la bruja sería
mucho más brusco.
10006 REM bruja
1010 FAFER 02 INK 7
19206 PRINT AT 1,53" 1": GO SUB 560: REM esp, tt), (3)
1030 PRINT AT 1,b:” EL": GO SUB 500: REM esp, (K), (1)
1046 PRINT AT 1,03" MN”: GO SUB 500: REM esp, (M>, (N>
106506 PRINT AT 1,b5" OP": REM esp, (0), (P), (Q)
1060 RETUEN
55060 REM fuego
9910 DIM +4(2,5): INE 46: PAPER 6
2920 FOR g=1 TO 6
5930 READ y,x: LET ft1,g)=y2: LET 41(2,9)=x
5540 NEXT y
95950 LET n=09
5560 FOR t=1 TO 4
557% LET n=n+1
5586 FOR d=1 TO 230
55970 FOR j=1 TO n
5600 PRINT AT 4 (1,3), (2,j)3"T": REM (t)
56106 PRINT AT 4f(1,3),4(2,3)3" "2 REM espacio
3620 NEXT j: NEXT di NEXT t
3630 FOR y=2 TO 11: FOR x=7 TO 23
5640 FRINT AT y,x3" ": REM espacio
5650 NEXT x: NEXT y
5660 RETURN
35060000060
La animación de las llamas es bastante ingeniosa. Uno de los
problemas es que el ordenador no puede tener más de un color
de tinta y otro de papel en cada carácter. Para resolverlo haremos
aparecer el fuego desde dentro del castillo, únicamente en las
ventanas.
La línea 5510 DIMensiona una matriz, que guardará las
posiciones de cada carácter correspondiente a una llama (T);
estas posiciones se ajustan a las coordenadas de las ventanas. Las
líneas 5560 a 5620 son tres bucles FOR... NEXT anidados. En
primer lugar se imprime la llama en amarillo en la posición f(1,1)
cuando j es igual a uno en la línea 5600. La línea 5610 imprime un
espacio sobre el fuego. Este proceso se repite 30 veces haciendo
vacilar la llama. Según aumenta n, j toma un nuevo valor, y el
proceso se repite en cada ventana hasta que las llamas alcanzan
la última
La casa se derrumba mediante dos bucles FOR... NEXT
anidados en las líneas 5630 a 5650 que borran la casa con una
serie de espacios en negro.
Go
60808
60
6060 REM calavera
6610 INK €
£0620 FOR 270 FO 430 STEFR =
60306 LET a=s*F1/180: LET x<=30x*SIN (23)
5040 LET y=40x*C0S (a: PLOT 127,135: DRAN x,y
6630 NEXT s: LET x1=67: LET x2=80
6066 FOR y=135 TO 27 STEP -1
5076 PLOT x1,y:2 DRAW x2,6:2: LET x1i=x1+.23s LET x2=x2-.4
6080 NEXT y
60970 FABER Os PRINT AT 65135" —"5AT 4,173"
REM esp, esp:iesp,esp
6160 FRINT AT 8,155" ": REM espacio,espacio
6116 FRINT AT 10,143" "i REM espacio,espacio,espacio
é61260 FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8
6130 IF FOINT (x,y)=1 THEN FAFER 6:
INK INT (RND*(73)+1:2 FLASH 1:
FRINT AT 22-y/3,x/8-13"6": FLASH 0: REM (6)
NEXT x: NEXT y
RETURN
54000000060
La fantasmagórica calavera que se cierne sobre la casa quemada
se crea mediante la subrutina calavera. La parte superior es
un semicírculo que se dibuja en color negro (INK 0) mediante el
lazo que comienza en la línea 6020, de forma que no se ve en esta
etapa. El resto de la cara se consigue mediante otro lazo en las
líneas 6060 a 6080 que dibuja una serie de líneas horizontales que
se van haciendo cada vez más estrechas según nos acercamos a
las ruinas de la casa.
La línea 6090 coloca los ojos con dos espacios en negro, y las
líneas 6100 y 6110 hacen lo mismo con la nariz y la boca.
Recuerda que hasta ahora la cara es invisible, ya que está
coloreada de negro sobre el cielo del mismo color. Para conseguir
un efecto intermitente emplearemos la función POINT que
estudia ciertos pixels sobre el área de la calavera. Si el pixel
corresponde a tinta —en otras palabras, si POINT devuelve el
valor 1— entonces se imprime el carácter gráfico 6 en esa
posición con un color aleatorio y de forma intermitente (FLASH
1). La calavera parece emerger de las ruinas de la casa según el
lazo la estudia desde la parte inferior hasta la más alta.
38
S0500050005
Almacena tus programas
A continuación se da el listado completo del programa tanto para
MSX como para Spectrum. Compruébalos si aún tienes
problemas. El listado MSX contiene líneas que no aparecen en el
libro (las que terminan en 5). Estas se han añadido para conseguir
efectos especiales en la ejecución del programa. Hacen que éste
sea más tétrico y no lo retardan.
19
Lo
20
30
40
50
60
70
go
85
40
1006
110
120
130
146
130
1506
170
300
210
320
306
s10
SO
330
940
43
350
566
0
570
1000
1010
1020
oa
1500
13 1
1320
1230
15935
1340
1
15660
1570
1580
1590
20060
2010
Listados de los programas
REM Casa Encantada
CLEAR 260,61482!'
SUREEN 24 235 COLOR 1,3, 1: CL5
ON SFRITE GOSUE 8665: SPRITE ON
GOSUBR £500:REM Inicializar
GOSUB 2600: REM Fondo
GOSUB 2500:REM Castillo
GOSUB 4506:REM Arboles
SOSUB 3000: REM Oscuridad
N=4:GOSUB 15060: REM Rayo
M=1300
BEEP
FOR XB=6 TO 254 STEP 2
GOSUR 5600:REM Murcielago
GOSUB 10006:REM Bruja
IF XAB=239% THEN FU SPRITE 3, 10, 209)
NEXT XE
N=4: GOSUB 156006: REM Rayo
GOSUB 5500:REM Fuego
GOSUB 6600: REM Calavera
END
REM Retardo
FOR K=1 TO R:NEXT
RETURN
REM Murcielago
IF MíS506 THEN XM=XM+2:GOTO 530
M=M-1 3: A=M*73., 14/1809: XM=120+ INT (40*SIN(A)):
YM=30+ INT” (23*C0S(A))
PUT. SPRATE da CAM, YM.
R=96: GOSUB 300: FUT SFRITE 1,(0,209)
PLAY "T153L6458MS00016"
PUT SBPRLITE Ly (XML, YD A 1
R=20:GOSUB 300: PUT SPRITE 2,(0,209)
PLAY "8"
RETURN
REM Bruja
YB=3 24 24xSIN(XBx24%, 14/2549)
PLUS SFRITE AB, YE), 2
RETURN
REM Rayu
FOR 1I=1 TO N
PFSET (240,6):DRAW "Ci1632R166G31"
POKE 61498'*,2%H1F:FRINT USR(O)
SOUND 3%,€: SOUND 1,6: SOUND 2,6: SOUND 3,0: SOUND 4,06:
SOUND 3,0: SOUND 6,31: SOUND 7,7: SOUND 8,146: SOUND 2,
16:SOUND 19,16: SOUND 11,6:SOUND 12,66: SOUND 13,0
R=200: GOSUB 2600
POKE 61493',2H14:PRINT USR (0)
PSET (240,0): DRAW "C16G32R16631"
R=400: GOSUR 300
NEXT 1
RETURN
REM Fondo
FOR R=1 TO 106
Continuación MSX
2020
2030
2040
2050
2060
-— 2070
2030
2090
2100
21109
120
2300
210
300
20360
3046
3030
30560
2070
30890
2090
3100
35300
y IE
Ed
3536
3540
do
35960
4000
4010
4020
4030
4300
4510
4520
4530
4340
4550
45409
4570
43286
5090
3010
5020
5030
50406
3300
33109
X=INT (RND(1)x255): Y=130+INT (RND(1)x050)
PSET ¿Xs Y) ¿ 1ENEXT
OPEN "GRP" AS +1: COLOR 5
FOR Y=06 TO 126 STEP 8:FOR X=0 TO 248 STEF 8
FPRESET (X,Y):FRINTH1,"N"
NEXT X: NEXT Y
I=16
FOR F=63 TO € STEP -2
X=138*SIN(P/60): Y=192-P:LINE (X,Y)-(X+I,Y),1
1=1+1.3:NEXT
RETURN
REM Castillo
x1=80:Y1=72: xX2=158: Y2=120:LAD=300:
GOSUBE 30606: REM Bloque frontal
X1=64: Y1=40: X2=80: Y2=80:LAD=709:
GOSUBE 30669: REM Torre izquierda
xX1=158:Y1=40:x2=184: Y2=80:LAD=70:
GOSUB 30606:REM Torre derecha
XxS=75: YS=8:G0SUB 3500:REM Tejado izquierdo
Xx3=180: YS=8:GOSUB 3560:REM Tejado derecho
FOR Y=60 TO 72
LINE (89,VY)- (147, Y,56
NEXT
X=68: Y=47:GOSUB 4009
X=75: Y=572: GOSUB 4506
x=182: Y=47:GOSUB 40590
x=174: Y=67:GOSUB 4000
Xx=96: Y=873:GOSUB 4600
x=154: Y=83: GOSUB 40960
FOR Y=104 TO 127: 1F Y<112 THEN
LINE (232-W, Y)-(244+Y,Y),1: NEXT
ELSE LINE (120,Y)-(136,Y),1:NEXT
RETURN
REM Bloque e
FOR Y=Yi TO Y2 STEF 8:FOR X=X1 TO X2 STEP 8
COLOR 9:PRESET (X,VY):PRINT $€1,"p"
NEXT X:NEXT Y
FOR Y=Y1 TOD Y2+*7 STEP 2
LBNE 1X141I1=(X2387.W>.1
NEXT Y
COLOR 1:FOR M=1 TO LAD
A=SINT (RND(1)x(X2-X14+7)4X1)2
B=INT (RND(1)x*(Y2-Y1+7)+Y1):FSET (A,B)>,1
NEXT M
RETURN
REM Segmento
R=38
FOR T=160 TO 200 STEP 2
A=T*3. 14/1806: Xx<=RxSIN(A) : Y=R*XCOS (A)
LINE (XS,YS)-(XS+X, YS-Y),6
NEXT
RETURN
REM Ventana
I=5
FOR J=Y TO Y+17:1F J<Y+S THEN
LINE (X+1/2,3)-(X+6-1/2,3),1:1=1-1:NEXT
ELSE LINE (X,J3)-(X+6,3),1: NEXT
RETURN
REM Arboles
DIM A(21)
FOR J=1 TO 21:READ N:A(J)=N:*NEXT
FOR J=i TO 21
I=BASE (10)+A(J)
VPOKE (1),0:VPOKE (1+1),1:VPOKE (1+32),32:7 .
VPOKE (1433),33:VPOKE (1+64),64: VPOKE (1+45),65
NEXT J
R=1000: GOSUB 300
RETURN
REM Oscuridad
PRINT USR(0)
PUT SPRITE 4, (16,8),10
R=1000: GOSUB 300
RETURN
REM Fuego
DIM F(246)
Continuación MSX
3920
036
33040
3330
35060
3970
3380
3590
3600
3603
FOR G=1 TO 4
READ X,Y:F(1,6)=X:F (2,6)=Y
NEXT G
N=0
FOR T=1 TO 4
N=N+1
FOR D=1 TO 30
FOR J=i TON
PUT SPFRITE ue (Fl. Files), 11
FOR W=i TO INT(RND(-TIME>)%30):NEXT YW:
Z= INT (RND(-TIME)*150)+2:SDUND 6,Z: SOUND 1,15:
SOUND 65,5:SOUND 7,£B10110110: SOUND 8, 16: SOUND
: SOUND 13,4
PUT SPRITE 3, 10, 207)
NEXT J:NEXT D:¿NEXT T
FOR Y= 8 TO 96 STEF 8:FOR X=564 TO 206 STEF 8
COLOR 1:<PRESET (%X,Y)3FRINTH1,"L"
NEXT X:NEXT Y
REM Calavera
COLOR 15
CIRCLE (128,468),36,15,0,3. 19357%:PSET (92,38)3
DRAW"M+20, 56R32M+20,-S56"
CIRCLE (112,40),8: CIRCLE (144,460),8
PSET(110,64) : DRAW "R4D8R4U4R4D4R4U4R4D4R4U4R4D4R4U
8R4D1 2G6G4L 4U4L 4D4L 4U4L 4D4L 4U4L 4D4L 4H4U12"
PSET (126,44): DRAW "D146H4M+4,-12"
PSET (130,44):DRAW "D16 E4M-4,- 12"
PAINT (128, 0)+1302 12
S BEEP:FLAY "TI6S1MIGODOD1A/A8. A244072C8.D1B16BE8.A164
8.416A2"
R=:3000: GOSUB 300
CLOSE +1
RETURN
REM inicializar
FOR I=61483!' TO 61508!
READ N$:FOKE I1,VAL("2RH"+N$) 2: NEXT
DEFUSR=41 483!
FOR I=BASE(12) TO BASE (12)+15:READ N:
VPOKE (1+4096),N: NEXT
FOR I=BASE(12) TO BASE (12)+15:READ N:
VPOKRE (1+24332) . ME NEAT
FOR I=BASE(12) TO BASE(123)+13:READ N:
VPOKE (1+45089),N: NEXT
FOR I=BASE (14)+32 TO BASE (14)+191:READ N:
VPOKE 1,NsNEXT
RETURN
DATA DB,99,21,00,20,0E,979,ED,6579,ED,61,21,00,00,3JE,
14,03, 98,23, 70, FE,18,82,57+F0,L73REM Lod. maquina
DATA 16,129,7/3,40,16,80,49,9,128,321/4,154, 164,60,
204,30,5,38, 178, 27,31, 15,3,3, 48, 96,192,192,1794,242
,152,128,1,1,1,3,3,7,31,31,192,192,192,128,128,128
12294,2092: REM Arbol
DATA 6,0,0,16,56,1235,239,63,153,3,2,0,0,0,0,9,0,0,0
,8,28,190,255,252,240,192,64,0,0,0,0, dead Mura. 1
DATA o, 0,095,0,0,13,31» 63,63,67,26,724, 8,0,0,0,0,0,0s
0,0,175, 248, 252, 232,232 98,2%4,16,0,05 5 EEN Murc.2
DATA ES 1, Os o, o, 1,3,159, 207,255, 195,129, 140, 0,0, 120
,192,96,96,224,192,192,224,240,255,192,128,128,192
19,0: REM Bruja
DATA 3,149,208) 504 122,120, 204.200 23931 218,2980,761, 1092
sd. 31. 310,1010,0, 12970,0,120, 120,0, 0,7% 12,152,248,
24012 REM Lunar
DATALOs ¿24 325. ds 0. 301,314 127,120, 2364 2208) LOW, y ul
.72a7184,0,17/,17,1479,1139,227,167,1067,171,185,1069,2005
208,224, 224: REM Llama
DATA 521,535,5406,547,550,562,565,570,580,592,600,
610,637, 540, 5857,061+4657,068610671,6764 700:
REM Pasion Sas
DATA 177,48,169,64,1479,84,91,84,71,064,623,48:
REM Posicion llamas
FOR R=8S TO 256 STEP 155FOR T=1 TO 166 STEF 260:
FOR A=1 TO T+15 STEP -15:SOUND 0,R-T:SOUND 1,8:
SOUND 7,254: SOUND 8,16: SOUND 12,5:SOUND 13,1:
NEXT A:NEXT T:NEXT R:SPRITE OFF: BEEP: RETURN
SPECTRUM
E
Y)
10
11
20
30
460
50
60
70
380
20
100
110
120
130
140
150
160
170
500
310
320
930
pi
340
545
3500
560
1000
1010
1070
1030
1046
1050
1065
1506
1510
1520
1305
15%0
1545
1553
1566
1570
15753
1580
1590
2000
2010
ZOZO
ZOJFO
2040
2050
2660
2070
20809
20790
210060
21
2120
21360
2900
REM 4 e
REM casa encantada :
REM 18 bytes de codigo mequima almacenados en la
linea 5
GO SUR 6360: REM inicializar
GO SUB 20606: REM fondo
GO SUB 250602 REM castillo
GO SUB 4500: REM arboles
GO SUB 5006: REM oscuridad
LET n=5: 60 SUB 1500: FEM rayo
LET m=1330
FOR b=6 TO 29
GO SUE 506: REM murcielago
GO SUB 10060: REM bruja
IF b=29: THEN PRINT. AT 1,295" "2 REM =sp,esp,esp
NEXT b
LET n=S: GO SUB 1506: REM rayo
GO SUB 5500: REM fuego
GO SUB £0006: REM calavera
Sue E
REM murcielago
IF m<150 THEN LET xm=xm+1: GO
LET m=m-89: LET a=mXxF1/180:
LET xm=16+INT (4.5*SIN (a))
LET ym=4+INT (3.S5*COS la))
PAFER 05 TM 7IIFPRIMT AT ym,xm3"R"+* REM (R)
PAUSE 3
PRINT AT ym,xm3"S"2z REM (5)
PAUSE 3
FPRINT AT ym,xm3" ": REM esp
RETURN
REM bruja
PAPER 0:
PRINT AT
FPRINT AT
PRINT AT
PRINT AT
RETURN
REM rayo
FOR i=1 TO mn
INK 62 FLOT 255,170: DRAW -39,-46: DRAW 10,0:
DRAW -29,-40
POFE 23761,7: RANDOMIZE USR 23760
INE 6: PRINF AT 3,355"6 380T.%,3 3. HS: REM (635 (H)
FAUSE 5
POKE 23761,1: RANDOMIZE USR 237660
INE £:, PRINT AT 3,33 "6 381 %,.303 HL REF 1633 CH
INK 602 FLOT 255,170: DRAW -39,-46: DRAW 19,0:
DRAW -27,-40
FAUSE 1
NEXT 1
RETURN
REM fondo
PAPER 43 INK 6: CLS
FOR r=i TO 100
LET x=INT (RND*255):2 LET y=INT (RND*80): FLOT x,y
MEXT FE PAPER
FOR y=09 TO 12: FOR x=06 TO 31
PRINT AT y,x3” ": REM espacio
NEXT x:3 NEXT y
INK 0
FLBT 6,2: DRA 2539, % LET. 1=4
FOR p=37 TO 6 STEP -2
PLOT i30*SIN (p/30),p: DRAW 1,0:
NEXT p
RETURN
REM castillo
LET uli=10: LET «2=21s LET yl=10: LET ye<-=161
LET lad=406: GO SUB 3600: FEM bloque frontal
LET x1=8: LET x2=16:2: LEY yi=6: LET y2=11:
LET lad=106: GO SUB REM blogue torre izdá.
LET xi=2l8 LET «a2=25%1 LET yi=682 LET y2=l1i:
LET lad=160: GO SUB 23060: REM bloque torre dcha. -
Ls
dl e la
-
-
14": 60 SUB 500
KL”": 60 SUB 500
o
¿ REM. SSP» la td)
: REM esp, (K), 11)
MN": GO SUB 500: REM esp, (M), (N>
OPC”? REM esps, (0), 1F)., 1010
4
A
- -
- -
po quo dr o
e u e]
Continuación Spectrum
LEÍ. NS=/01 LET ya=13%3
50 SUB 3500: REM segmento tejado torre
LET xs=179: LET ys=159:
GO SUB 3500: REM segmento tejado torre
FOR r=88 TO 103
PLOT 88,5 DRAW 77,0
MEAT
FOR b=12 TO ZO STEP <:
PRINT AT. .11,4B5"S 5. NEAI Es REM 13.
LEI *»=68:%: LET y=182: 60 SUR 40606
LET x=76: LET y=88: GO SUB 4000
LET x=182: LET y=i102: GO SUB 400060
LET x=174: LET y=88: GO SUB 46006
LET x=96: LET y=56: 60 SUB 4006
zZ630 LET Xx51572 LET y=56: 6D SUB 460060
26064 PFRINT AT 13,139”88 A ló,s,los 28:
REM (87, (1D 19), 18)
267060 RETURN
3000 REM bloque
SLO FOR vesye¿ TO yl STEF —15 POR x=:91 TO =2
3020 FAFER 2: PRINT AT y,x3" ": REM.espacio
000 MEXT ME NEXT y
20040 LE? xi=x1%58s2 LET. x2=x2*9s LET yi=y1*8: LET y2=y2*B5
030 FUR y=y2Z TO" yl: STEP =<
300 INE €s PLOT x1,168-y3 URAN (x2-x13+7,0
0706 NEXT y
2080 FOR m=1 TO lad
00 LEFT aS= INT (RND*t=2=x1+/)+81)5
LET b=168-INT (RND*(y2-y1)+y1): PLOT a,b
31060 NEXT m
2110 RETUEN
32900 REM segmento
2010 LET r=3921 INK 3
35920 FOR t=166 TO 200
2536 LET a=txP1/186: LET x=r*SIN (a): LET y=r*C0S
3946 FLOT xs,ys: DRANW x.y
33990 NEXT t
356646 RETURN
4000 REM ventana
40168 INE 0: FOR w=y TO y+10: FLOT »x,w: DRAWN 23,0
2011 NEXT w
4020 RETURN
43600 REM arboles
4510 FAFER 4: INK (O: OVER 1
45920 FOR t=1 TO 3060
4936 LET x<=INT (RND*293: LET y=13+INT (RND*7>
340 1F t828 AND x<22 AND y17) THEN 60 TO 4530
43500 FRINT AT y,»3"AB"3A7 y+1,x3 "CD"paT SEZA E ERE
REI 18), 1E9 3 Gs 1018 15). 15)
945366 NEXT t
4976 OVER 0: FAUSE 20060
586 RETURN
506060 REM oscurided
20160 POKE 2<3/61,1: RANDOGMIZE USRK 22766
JazoO PAPER Oy INE 6: PRINT AT 3,433"6"34A1 4.33 Hs
REM (6G)3(H) :
5030 FAUSE 100
250496 RETURN
9500 REM fuego
910 DIM +t(2,6l3 INE 613 FAFES €
2o20 FOR g=1 TO 6
aa E ¿t LES Pt. =yi LET Fi. D)=xX
55490
5550
a
Ae
Suda
TO
5600 ERINT AT A IN E AS
616 PRINT Al FllzsidetIcsJos Ss. REN espacio
3620 NEXT:335 MEAT d5 NEXT €
5630 FDR. ye2 TO 113 FOR s=7 10 Lo
5640 PRINT 47 y,x3" "3: REM espacio
SOJO.NEAT «xs» NEXT y
5660 RETURN
60606060 REM calavera
Continuación Spectrum
66010
6020
60730
5040
66050
6666
5070
6080
6970
6100
6110
6120
6130
-6140
6150
6500
6510
52
A
550
65409
79005
7010
7020
70:30
7040
7050
70606
7070
7030
70790
7100
7110
7120
71:30
7140
TIOS
7160
7170
7180
7190
7300
7310
7320
73930
7540
INK 0
FOUR s=270 TO 450 STEP 2
LET a=s*F1/180: LET *=40*SIN (23)
LET y=40LOS ta)? FLOT 12/,1353
NEXT s: LET x1=87: LET x2=806
FUR y=133 716 7 Se =1
PLOT xi,zys DRAW x2,02 LET xi=xi+.3: LET x2=x2-.4
NEXT y
PAPER UU; PRINTS” "¡AT 56,173”
REM esp, esp;esp,esp
FRINT AT 8,153" "2: REM espacio,especio
PRINT AT 10,143” ": REM espacio,espacio, espacio
FOR y=81 TO 169 STEP 8: FOR x=87 TO 167 STEF 8
IF FOINT (x,y)=1 THEN FAFER 6:
INE INT (RND*(7))+1:2 FLASH 1:
PRINTER BD 10-15"6": FLASH-6: REM (6)
NEXT x:z WEXT y
RETURN
REM inicializar
FOR a=65368 TC £5527: READ de: FOKE a,d: NEXT a
REM introducir codigo maquina en la sentencia
REM de la linea S
FOR i=23760 TO 23777: READ d: FOKE i,d: NEXT i
RETURN
DATA 16,129,773,40,15,80,48,79: REM arbol (A)
DATA 128,32,74,134,164,68,204,30: REM arbol (B)
DATA SIB id. 22 REM arbol (0)
DRAN x,y
DATA 48,96,192,192,192,244,152,128: REM arbol (D)
DATA 1,1,1,3,3,742 2 605 REM arbol (E)
DATA 192,192,192, TRA IEA 120, 224, 2321 REM arbol tF)
DATA 3,16,48,32,76,76,233, 224: REM luna (6)
DATA 246,254,127,1173,48,54,31,6: REM luna (H)
DISTA 1, 216:230,17,2313417,2253 REN bruja (P)
DATA 0,6,6,128,240,179,0,0: REM bruja (3)
DATA 9,0,1,57,4,31,4,506:2 REM bruja (1K)
DATA 64,128, 128,150, 252,224,64,128: REM bruja (L)
DATA 06,0,0,14,1,7,1,14: REM bruja (M) :
DATA 16,32,96,164,63,248,16,32: REM bruja (N)>
DATA 0,9,0,3,0,1,0,3: REM bruja (0)
DATA 4,8,24,154,79,254,68, 136: FEM bruja (FP)
DATA 9,0,9,60,192,0,0,0: REM bruja (0)
DATA 0,0,0,66,36,214,24,0: REM murcielago (R)
DATA 0,0,0,0,0,2559,24,6: REM murcielago (S)
DATA 8,128,65,2,150,68,40,40: REM llamas (T)
REM datos codigo maquina
DATA 62,0,33,0,88,6,24,197,6,32
DATA 119,335,16,2352¿173,16, 206,201
REM datos posicion ventanas
DATA 10,22,8,23,14,19,14,12,10,9,8,8
SS ARA :
. — ESTA » NUEVA SERIE Cl E CONSTITUYE LIN LUNA INTRODUCCIÓN
AL ARTE DE PROGRAMAR ORDENADORES: CADA LIBRO
SMO ESTRUCTURAR EN PROGRAMA EN A A
% | A ENSEÑA C CÓN
ES e RUTINAS. >S AL MISMO TIEMPO EXPLICA Da ANALIZA
SE ES PIDE AL ORDENADOR QUE HAGA E
e Lo QUE
| POR QUÉ. :
| E
__— PEA .
EEtE iy ADEMÁS E ES ONVERTIDO! CADA 1 LIBRO > CONTIENE E
| como MÍNIMO UN WLIEGO. DE ORDENADOR,
| _APASIONANTE Y ORIGINAL, ! ESTRUCTURADO [ DE
a | TAL MODO QUE PUEDE AMPLIARSE O REDUCIRSE,
E p DE ACUERDO CON EL NIVEL 0108! DESEOS DEL
des | USARIO.
> Lay e A 0 -_ is mn SS A
7 E
S AN
e TÍTULOS DE LA SERIE
Gráficos - ici LÓ
Iniciación al basic - El banco d
o de datos
es Animació ]
ión - Sonido - Gráficos móviles
000000000000 00090
APRENDE A PROGRAMAR
NIMACIÓN
Marcus Milton
ANAYA